/*
 * @Descripttion: 这个类负责与客户端通信/交流
 * @version: 1.0
 * @Author: 自由如风
 * @Date: 2021-05-19 17:39:11
 * @LastEditors: 自由如风
 * @LastEditTime: 2021-05-23 09:36:30
 */


const WS = require('ws')

const { Store } = require('weixin-nodejs')


/** 所有的背景色，将随机从这里挑选一个 */
const bulletColorArr = ["#06ad3d", "#55cb44", "#3498db", "#f46825", "#e74c3c", "#e15fd8", "#95a5a6", "#f39c12", "#6c51f3", "#f562d8"];
/** 默认头像 */
const defaultAvatar = './img/avatar.gif'


class WebSocketServer {
    ws
    constructor(port = 30082) {
        this.ws = new WS.Server({
            port
        })
        this.ws.on('connection', this.onConnection)
    }

    /** 处理客户连接事件 */
    onConnection(socket, req) {
        /**
         * 绑定一次性事件，只给一次客户端一次自报身份的机会
         *      客户端发来的数据应该是一个字符串，表示这用户的 openid
         */
        socket.once('message', (openId) => {
            console.log("客户请求接入", openId)
            socket.openId = openId;

            socket.send(JSON.stringify({ type: 'barrage', data: { content: '已就绪。' } }))
        })
    }

    /** 向这个 openid 发送数据（可能不止一个） */
    send(openId, str) {
        this.ws.clients.forEach(e => {
            console.log(e.openId)
            if (e.openId == openId) {
                e.send(str)
            }
        })
    }

    sendBullet(openId, data) {
        /**
         * 前台已经对 随机颜色和随机背景有做处理。传的话就是覆盖
         */
        // 随机背景颜色
        const defaultBGColor = bulletColorArr[Math.floor((Math.random() * bulletColorArr.length))] || bulletColorArr[0];
        const default_data = {
            avatar: defaultAvatar,
            content: '',
            url: '',
            color: '',
            bgColor: defaultBGColor,
            safeTop: 150,
            safeBottom: 20,
            hasClose: true
        }
        this.send(openId, JSON.stringify({ type: 'barrage', data: { ...default_data, ...data } }))
    }
}

module.exports = WebSocketServer;